# def outer():
#     a = 10
#     def inner():
#         b = 200
#         # b += a # 内部函数能使用外部函数的变量
#         nonlocal a # 声明外部函数的变量,用nonlocal
#         a += b # 内部函数修改外部函数的变量
#         print('我是内部函数')
#     # result = locals() # locals() 获取内部函数的局部变量,以字典的形式返回
#     # print(result)
#     print(a)
#     # print(inner)
#     inner()  # 调用内部函数
# outer()


# 内层函数-->外层函数-->全局变量-->系统builtins
a = 100
def outer():
    a = 200
    def inner():
        a = 300
        print('内部函数',a)
        a -= 50
    print(a) # 200
    inner() # 300

outer()
print(a) # 100
print('------------------------------------------------')

a = 100
def outer():
    a = 200

    def inner():
        global a
        a -= 50
        print('内部函数', a)

    print(a)  # 200
    inner()  # 50

outer()
print(a)  # 50
print('------------------------------------------------')

a = 100
def outer():
    a = 200

    def inner():
        nonlocal a
        a -= 50
        print('内部函数', a)

    print(a)  # 200
    inner()  # 150

outer()
print(a) # 100
print('------------------------------------------------')

'''
闭包：
1.嵌套函数
2.内部函数使用外部函数的变量
3.返回值是内部函数
'''
def outer(n):
    a = 10
    def inner():
        b = a + n
        print('内部函数',b)
    return inner

r = outer(100)
print(r)
r()
